package com.demo.delayed_queue;

import com.demo.commons.MqCons;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * @author shenguangyang
 */
@Configuration
public class OrderClose01Config {
    @PostConstruct
    public void init() {
        System.out.println("order mq binding success!!");
    }
    @Bean
    public DirectExchange orderDirectExchange01() {
        return ExchangeBuilder.directExchange(MqCons.ORDER_CLOSE_EXCHANGE01).durable(true).build();
    }


    @Bean
    public Queue orderQueue01() {
        // 订单超时后进入死信队列中
        Map<String, Object> arguments = new HashMap<>();
        // 设置队列中消息的过期时间, 10s之后会被转移到死信队列中
        arguments.put("x-message-ttl", 10000);
        // 当消息过期时候, 需要通过指定的交换机打入到死信队列中
        arguments.put("x-dead-letter-exchange", MqCons.ORDER_DEAD_EXCHANGE01);
        /*
         * durable: 是否为持久队列（该队列将在服务器重启后保留下来）
         * exclusive: 是否为排它队列
         * autoDelete: 如果队列为空是否删除（如果服务器在不使用队列时是否删除队列）
         * routingKey: 队列路由键（队列绑定交换机的匹配键，例如：“user” 将会匹配到指定路由器下路由键为：
         *              【*.user、#.user】的队列）不能为null, 否则队列和交换机绑定失败
         */
        return new Queue(MqCons.ORDER_CLOSE_QUEUE01, true, false, false, arguments);
    }

    @Bean
    public Binding orderBinding(@Qualifier("orderQueue01") Queue queue, @Qualifier("orderDirectExchange01") DirectExchange exchange) {
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("");
    }
}
